const jwt = require('jsonwebtoken');

/**
 * JWT 认证中间件
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 * @param {Function} next - 下一个中间件函数
 */
const auth = (req, res, next) => {
  // 1. 获取并验证 Authorization 头
  const authHeader = req.header('Authorization');
  console.log("处理前面的token")

  if (!authHeader) {
    return res.status(401).json({
      code: 401,
      message: '认证失败：未提供 Token',
      data: null
    });
  }
  console.log("处理前面的token")
  // 2. 提取 Token（兼容 Bearer 和直接 Token 两种形式）
  const token = authHeader.startsWith('Bearer ')
    ? authHeader.slice(7).trim()
    : authHeader.trim();

  console.log("处理后的token：：", token)

  if (!token) {
    return res.status(401).json({
      code: 401,
      message: '认证失败：Token 格式不正确',
      data: null
    });
  }

  try {
    // 3. 验证 Token
    const decoded = jwt.verify(token, '39qw89r23890');

    // 4. 检查 Token 是否在黑名单中（如果需要实现强制过期）
    // 这里可以添加 Redis 黑名单检查逻辑

    // 5. 将用户信息附加到请求对象
    req.user = {
      id: decoded.id,
      username: decoded.username,
      role: decoded.role,
      // 其他需要传递的字段...
      iat: decoded.iat, // 签发时间
      exp: decoded.exp  // 过期时间
    };

    // 6. 继续处理请求
    next();

  } catch (error) {
    // 7. 错误处理
    let statusCode = 401;
    let errorMessage = '认证失败';

    if (error instanceof jwt.TokenExpiredError) {
      errorMessage = 'Token 已过期';
      statusCode = 403; // 403 表示理解请求但拒绝授权
    } else if (error instanceof jwt.JsonWebTokenError) {
      errorMessage = '无效的 Token';
    }

    console.error('认证错误:', error.name, error.message);

    res.status(statusCode).json({
      code: statusCode,
      message: errorMessage,
      data: {
        errorType: error.name,
        expiresAt: error.expiredAt // 如果是过期错误，这里会有值
      }
    });
  }
};

module.exports = auth;